/**
 * 网络对象，使用步骤：
 * 1. 创建
 *      network_new_from_global()
 * 2. 连接 WiFi
 *      network_connect_wifi()
 * 3. 连接到 TCP 服务器
 *      network_connect_server()
 * 4. 发送信息到服务器
 *      network_send()
 */
#ifndef __NETWORK
#define __NETWORK

typedef struct _Network Network;
#define NETWORK(any) ((Network *)(any))

/**
 * @brief 网络返回的处理钩子
 */
typedef void (*NetworkHandler)(void *object, void *datas);
#define NETWORK_HANDLER(any) ((NetworkHandler)(any))

/**
 * @brief 网络对象当前的 flags 状态
 */
#define NETWORK_FLAGS_CWMODING      0x01
#define NETWORK_FLAGS_WIFI_CONNING  0x02
#define NETWORK_FLAGS_QUERING_ADDR  0x04
#define NETWORK_FLAGS_CONNECTED_TCP 0x08

/**
 * @brief 获取网络全局对象
 */
extern Network *network_new_from_global(void);

/**
 * @brief 重置网络到初始化状态
 */
extern void network_restore(Network *self);

/**
 * @brief 连接到 WiFi，连接成功后，还将保存获取到的 IP 地址
 * @param ssid WiFi名称
 * @param passwd WiFi 密码
 */
extern void
network_connect_wifi(Network *self, const char *ssid, const char *passwd);

/**
 * @brief 连接到 TCP 服务器
 */
extern void
network_connect_server(Network *self, const char *address, const char *port);

/**
 * @brief 发送一段信息，'\0'结束
 */
extern void
network_send(Network *self, const char *datas);

/**
 * @brief 连接到处理网络返回的钩子
 * @param object 处理网络返回的对象
 * @param handler_cb 对象钩子
 */
extern void
network_signal_connect(Network *self, void *object, NetworkHandler handler_cb);

/**
 * @brief 获取网络对象的 flags 标志
 */
extern unsigned char network_get_flags(Network *self);

/**
 * @brief 获取网络对象的 IP 地址
 */
extern const char *network_get_addr(const Network *self);

#endif
